// 方法1使用封装好的 对对象的劫持 的方法，引入
import { observer } from "./index";

//重写 数组===>方法劫持
//(1) 获取原来的数组方法
let oldArrayProtoMethods = Array.prototype;

//(2) 继承（创建一个新的对象，该对象的原型__proto__ 设置为Array.prototype，，，新创建的对象继承了 数组原型上的所有的属性和方法）
export let ArrayMethods = Object.create(oldArrayProtoMethods);

// 劫持哪些数组中哪些方法
let methods = ["push", "pop", "unshift", "shift", "splice"];

// 运行这些方法,继承过来的方法
methods.forEach((item) => {
  // 为ArrayMethods对象添加 变异方法 （进行劫持这些属性 push pop...） 属性:function
  ArrayMethods[item] = function (...args) {
    // {list: []}

    console.log(this, args, "劫持数组，。。。参数"); // this ==> list  args等于vm.list.push(arg)中的arg
    //arr.push({zmy:'adfd'})  1.数组追加数据===>动态新添加的对象进行劫持
    let inserted;
    switch (item) {
      case "push": // 数组尾部添加元素
      case "unshift": //数组开头添加元素
        inserted = args;
        break;
      case "splice": // 这个也可以追加元素到数组
        inserted = args.splice(2); //arr.splice
        break;
    }
    //console.log(inserted,'追加的新的对象')
    //对新追加的对象进行劫持
    if (Array.isArray(inserted)) {
      //console.log(this,inserted,'inserted1123')
      // 这里目的是为了调用Observe 实列下的一个对 对象obj进行劫持的方法
      this.__data__.observerArrayObj(inserted);
    }
    //运行数组原有的方法
    let result = oldArrayProtoMethods[item].apply(this, args); //this是具体的数组实列 调用的时候 list: []中的[]
    //数组更新依赖
    console.log(this.__data__, "this---数组劫持--111");
    this.__data__.dep.notify(args);
    return result;
  };
});
